package com.eian.boot.metrics.collector;

import com.eian.boot.metrics.model.PerformanceRecord;

import java.util.List;
import java.util.Map;

/**
 * 性能数据收集器接口
 *
 * @author alex.meng
 */
public interface PerformanceCollector {

    /**
     * 收集性能记录
     *
     * @param record 性能记录
     */
    void collect(PerformanceRecord record);

    /**
     * 批量收集性能记录
     *
     * @param records 性能记录列表
     */
    void collectBatch(List<PerformanceRecord> records);

    /**
     * 获取所有性能记录
     *
     * @return 性能记录列表
     */
    List<PerformanceRecord> getAllRecords();

    /**
     * 根据条件查询性能记录
     *
     * @param conditions 查询条件
     * @return 性能记录列表
     */
    List<PerformanceRecord> findRecords(Map<String, Object> conditions);

    /**
     * 获取性能统计信息
     *
     * @return 统计信息
     */
    PerformanceStatistics getStatistics();

    /**
     * 清空所有记录
     */
    void clear();

    /**
     * 获取记录总数
     *
     * @return 记录总数
     */
    long getRecordCount();

    /**
     * 性能统计信息
     */
    interface PerformanceStatistics {
        /**
         * 总记录数
         */
        long getTotalCount();

        /**
         * 成功记录数
         */
        long getSuccessCount();

        /**
         * 失败记录数
         */
        long getFailureCount();

        /**
         * 平均执行时间
         */
        double getAverageExecutionTime();

        /**
         * 最大执行时间
         */
        long getMaxExecutionTime();

        /**
         * 最小执行时间
         */
        long getMinExecutionTime();

        /**
         * 慢方法数量
         */
        long getSlowMethodCount();

        /**
         * 按方法分组的统计
         */
        Map<String, MethodStatistics> getMethodStatistics();

        /**
         * 按标签分组的统计
         */
        Map<String, Long> getTagStatistics();
    }

    /**
     * 方法统计信息
     */
    interface MethodStatistics {
        /**
         * 方法名
         */
        String getMethodName();

        /**
         * 调用次数
         */
        long getCallCount();

        /**
         * 平均执行时间
         */
        double getAverageTime();

        /**
         * 最大执行时间
         */
        long getMaxTime();

        /**
         * 最小执行时间
         */
        long getMinTime();

        /**
         * 成功率
         */
        double getSuccessRate();
    }
}
